package com.ibatis4J.framework.dal.client;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.GenericStoredProcedure;

import com.ibatis4J.framework.dal.dao.support.rowmapper.RowMapperFactory;
import com.ibatis4J.framework.dal.dao.support.sql.FreeMakerParser;
import com.ibatis4J.framework.dal.resource.parse.SqlBean;
import com.ibatis4J.framework.dal.util.DalUtils;

/**
 * 数据连接接口类
 * 
 * @author liuwenya
 *
 */
public interface DalClient {
	
	/**
	 * 数据持久化操作
	 * 
	 * @param entity  数据实体
	 * @return  持久化操作成功记录数
	 */
	public Number persist(Object entity);
	
	/**
	 * 数据持久化
	 * 
	 * @param entity  数据实体
	 * @param requiredType  需处理的类型
	 * @param <T> 泛型对象
	 * @return  持久化操作成功记录数
	 */
	<T> T persist(Object entity, Class<T> requiredType);
	
	/**
	 * 数据合并与更新
	 * 
	 * @param entity 更新的数据实体
	 * @return 数据更新后的结果
	 */
	int merge(Object entity);
	
	/**
     * 动态更新
     * 
     * @param entity 更新的数据实体
     * @return 返回更新的记录数目
     */
    int dynamicMerge(Object entity);
    
    /**
     * 单表删除操作 根据主键删除记录
     * 
     * @param entity 实体对象
     * @return 删除成果的记录数
     */
	int remove(Object entity);
	
	/**
     * 查询单个记录 根据传入实体类的主键
     * 
     * @param entityClass 实体类
     * @param entity 查询对象
     * @param <T> 泛型对象
     * @return 查询结果
     */
    <T> T find(Class<T> entityClass, Object entity);

	/**
	 * 根据sqlId查询单条记录
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param paramMap
	 *            查询参数
	 * @param requiredType
	 *            返回对象类型
	 * @return 查询结果
	 */
	<T> T queryForObject(String sqlId, Map<String, Object> paramMap, Class<T> requiredType);

	/**
	 * 根据sqlId查询单条记录
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param param
	 *            查询参数对象
	 * @param requiredType
	 *            返回对象类型
	 * @return 查询结果
	 */
	<T> T queryForObject(String sqlId, Object param, Class<T> requiredType);

	/**
	 * 根据sqlId查询单条记录
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param paramMap
	 *            查询参数
	 * @param rowMapper
	 *            返回结果对象映射实例
	 * @return 查询结果
	 */
	<T> T queryForObject(String sqlId, Map<String, Object> paramMap, RowMapper<T> rowMapper);

	/**
	 * 根据sqlId查询单条记录
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param param
	 *            查询参数对象
	 * @param rowMapper
	 *            返回结果对象映射实例
	 * @return 查询结果
	 */
	<T> T queryForObject(String sqlId, Object param, RowMapper<T> rowMapper);

	/**
	 * 查询并返回映射集
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param paramMap
	 *            查询参数
	 * @return 查询结果
	 */
	Map<String, Object> queryForMap(String sqlId, Map<String, Object> paramMap);

	/**
	 * 查询并返回映射集
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param param
	 *            查询参数对象
	 * @return 查询结果
	 */
	Map<String, Object> queryForMap(String sqlId, Object param);

	/**
	 * 根据sqlId查询多条记录，返回list型结果集
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param paramMap
	 *            查询参数
	 * @param rowMapper
	 *            返回结果对象映射实例
	 * @return 查询结果
	 */
	<T> List<T> queryForList(String sqlId, Map<String, Object> paramMap, RowMapper<T> rowMapper);

	/**
	 * 根据sqlId查询多条记录，返回list型结果集
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param paramMap
	 *            查询参数
	 * @param requiredType
	 *            返回对象类型
	 * @return 查询结果
	 */
	<T> List<T> queryForList(String sqlId, Map<String, Object> paramMap, Class<T> requiredType);

	/**
	 * 根据sqlId查询多条记录，返回list型结果集
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param param
	 *            查询参数对象
	 * @param requiredType
	 *            返回对象类型
	 * @return 查询结果
	 */
	<T> List<T> queryForList(String sqlId, Object param, Class<T> requiredType);

	/**
	 * 根据sqlId查询多条记录，返回list型结果集
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param param
	 *            查询参数对象
	 * @param rowMapper
	 *            返回结果对象映射实例
	 * @return 查询结果
	 */
	<T> List<T> queryForList(String sqlId, Object param, RowMapper<T> rowMapper);

	/**
	 * 根据sqlId查询多条记录，返回List<Map<String, Object>>型结果集，queryForList重载方法
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param paramMap
	 *            查询参数
	 * @return 查询结果
	 */
	List<Map<String, Object>> queryForList(String sqlId, Map<String, Object> paramMap);

	/**
	 * queryForList重载方法
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param param
	 *            查询参数对象
	 * @return 查询结果
	 */
	List<Map<String, Object>> queryForList(String sqlId, Object param);

	/**
	 * 执行sql,返回更新成功的记录数
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param paramMap
	 *            查询参数
	 * @return 更新成功的记录数
	 */
	int execute(String sqlId, Map<String, Object> paramMap);

	/**
	 * 执行sql,返回更新成功的记录数
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param param
	 *            查询参数对象
	 * @return 更新成功的记录数
	 */
	int execute(String sqlId, Object param);

	/**
	 * 批量更新
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param batchValues
	 *            需要批处理的集合
	 * @return 批处理成功记录数
	 */
	int[] batchUpdate(String sqlId, Map<String, Object>[] batchValues);

	/**
	 * 调存储过程
	 * 
	 * @param sqlId
	 *            SQLID
	 * @param paramMap
	 *            执行参数
	 * @param sqlParameters
	 *            sqlcommand参数的对象
	 * @return 存储过程执行结果
	 */
	Map<String, Object> call(String sqlId, Map<String, Object> paramMap, List<SqlParameter> sqlParameters);
}
